# 导入requests模块
import requests
# 导入pandas模块
import pandas as pd
# 导入BeautifulSoup模块
from bs4 import BeautifulSoup
# 导入time模块
from time import sleep

# 设置headers
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.69'
}


# 定义主函数
def main():
    # 创建一个空列表
    data = []
    # 遍历join_url函数返回的url
    for url in join_url():
        # 每次循环暂停2秒
        sleep(2)
        # 遍历crawling_anime函数返回的anime
        for anime in crawling_anime(url):
            # 每次循环暂停2秒
            sleep(2)
            # 将crawling_anime_detail函数返回的数据添加到data列表中
            data.append(crawling_anime_detail(anime))
            # 打印data列表
            print(data)
    # 调用sava_data_to_csv函数，将data列表中的数据保存到csv文件中
    sava_data_to_csv(data)


# 定义一个函数，用于拼接url
def join_url():
    # 创建一个列表，用于存放拼接后的url
    urls = ["http://m.iyinghua.io/china/"] + [f"http://m.iyinghua.io/china/{i}.html" for i in range(2, 34)]
    # 返回拼接后的url列表
    return urls


# 定义一个函数，用于爬取动漫信息
def crawling_anime(url):
    # 使用requests模块发送get请求，获取响应
    response = requests.get(url, headers=headers)
    # 将响应内容解码
    html = response.content.decode()
    # 使用BeautifulSoup模块解析html文档
    soup = BeautifulSoup(html, 'html.parser')
    # 找到所有class为itemtext的a标签
    a_list = soup.find_all('a', class_="itemtext")
    # 创建一个空列表，用于存放爬取的信息
    data = []
    # 遍历a_list，获取每个a标签的文本和链接
    for a in a_list:
        title = a.text.strip()
        href = a['href']
        # 将获取的信息添加到data列表中
        data.append([title, href])
    # 返回data列表
    return data


# 定义一个函数，用于爬取动漫详情
def crawling_anime_detail(data):
    # 发送get请求，获取响应
    response2 = requests.get("http://m.iyinghua.io" + data[1], headers=headers)
    # 获取响应内容，并解码
    html2 = response2.content.decode()
    # 使用BeautifulSoup解析html
    soup2 = BeautifulSoup(html2, 'html.parser')
    # 获取页面中p标签的数量
    p_list = soup2.find_all('p', limit=4)
    # 获取评分
    rating = p_list[0].text.strip()
    # 获取状态
    status = p_list[1].text.strip()
    # 获取日期
    date = p_list[2].text.strip()
    # 获取动漫类型
    anime_type = '|'.join([i.text.strip() for i in p_list[3].find_all('a')])
    # 返回数据加上评分、状态、日期、动漫类型
    return data + [rating, status, date, anime_type]


# 将数据存储到csv文件中
def sava_data_to_csv(data):
    # 将数据转换为DataFrame
    df = pd.DataFrame(data, columns=['title', 'href', 'rating', 'status', 'date', 'anime_type'])
    # 将DataFrame存储到csv文件中
    df.to_csv('../static/data/anime.csv', index=False, encoding='utf_8_sig')


if __name__ == '__main__':
    main()